package com.spel.validate.service;

import com.spel.validate.exception.NoPermissionException;
import org.springframework.stereotype.Service;

import java.util.Arrays;

/**
 * @title: AuthService
 * @Author xu-xiang
 * @Date: 2024/1/29 17:23
 * @description: 验证方法bean, 验证失败抛错
 */
@Service
public class ValidateThrowsService extends ValidateService {

    /**
     * 判断角色是否具有接口权限
     *
     * @param permission 权限编号,对应菜单的MENU_CODE
     * @return {boolean}
     */
    public boolean hasPermission(String permission) {
        if (super.hasPermission(permission)) {
            return true;
        }

        throw new NoPermissionException("你没有" + permission + "权限!");
    }

    /**
     * 只有超管角色才可访问
     *
     * @return {boolean}
     */
    public boolean isSuperAdmin() {
        if (super.isSuperAdmin()) {
            return true;
        }

        throw new NoPermissionException("只有管理员能访问!");
    }

    /**
     * 是否已登录
     *
     * @return {boolean}
     */
    public boolean hasLogin() {
        if (super.hasLogin()) {
            return true;
        }

        throw new NoPermissionException("请先登录, 登录后才能访问!");
    }

    /**
     * 是否有时间授权
     *
     * @param start 开始时间
     * @param end   结束时间
     * @return {boolean}
     */
    public boolean hasTimeAuth(Integer start, Integer end) {
        if (super.hasTimeAuth(start, end)) {
            return true;
        }
        throw new NoPermissionException("当前接口仅时间 " + start + "至" + end + "时开启访问!");
    }

    /**
     * 判断是否有该角色权限
     *
     * @param role 单角色
     * @return {boolean}
     */
    public boolean hasRole(String role) {
        if (super.hasRole(role)) {
            return true;
        }

        throw new NoPermissionException("当前接口仅角色: " + role + "可以访问!");
    }

    /**
     * 判断是否具有所有角色权限
     *
     * @param role 角色集合
     * @return {boolean}
     */
    public boolean hasAllRole(String... role) {
        if (super.hasAllRole(role)) {
            return true;
        }

        throw new NoPermissionException("当前接口需拥有全部角色: " + Arrays.toString(role) + "可以访问!");
    }
}
